package mSecretaria;



import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import myUtils.Constantes;
import myUtils.Constantes;
import myUtils.DBUtils;
import myUtils.EstadoLivro;
import myUtils.IModelo;
import play.db.DB;
import play.db.jpa.Model;

public class MLivro extends Model implements IModelo {
	
	//atrinutos 
	
	private int codLivro;
	private int codTipoLivro;
	private EstadoLivro estado;
	private String tipoLivro;
	private String sigla;
	private String descricao;
	private Date dataInicio;
	private Date dataFim;
	
	
	//métodos de acesso
	
	public int getCodTipoLivro() {
		return this.codTipoLivro;
	}

	public void setCodTipoLivro(int codTipoLivro) {
		this.codTipoLivro = codTipoLivro;
	}

	public EstadoLivro getEstado() {
		return this.estado;
	}

	public void setIntEstado(EstadoLivro estado) {
		this.estado = estado;
	}

	public String getSigla() {
		return this.sigla;
	}

	public void setSigla(String sigla) {
		this.sigla = sigla;
	}

	public String getDescricao() {
		return this.descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Date getDataFim() {
		return this.dataFim;
	}

	public void setDataFim(Date dataFim) {
		this.dataFim = dataFim;
	}

	public int getCodLivro() {
		return this.codLivro;
	}

	public String getTipoLivro() {
		return this.tipoLivro;
	}

	public Date getDataInicio() {
		return this.dataInicio;
	}

	//construtores
	public MLivro (int aCodLivro) throws Exception
	{
		ResultSet rs;
		
		String strQuery = "select Livro.*,TipoLivro.Descricao as TipoLivro from livro,tipoLivro where livro.CodTipoLivro = TipoLivro.CodTipoLivro";
		strQuery += " and  Livro.CodLivro = " + aCodLivro;
			
		try
		{
			rs = DB.executeQuery(strQuery);
			
			
			if(rs == null)
				throw new Exception("Livro não cadastrado!");
			
			while (rs.next())
			{
				this.codLivro		= rs.getInt("CodLivro");
				this.codTipoLivro	= rs.getInt("CodTipoLivro");
				this.dataFim		= rs.getDate("DataFim");
				this.dataInicio		= rs.getDate("DataInicio");
				this.descricao		= rs.getString("Descricao");
				this.sigla			= rs.getString("Sigla");
				this.tipoLivro		= rs.getString("TipoLivro");
				
				switch(rs.getInt("CodTipoLivro"))
				{
					case Constantes.lvAberto: this.estado = EstadoLivro.Aberto;break;
					case Constantes.lvFechado: this.estado = EstadoLivro.Fechado;break;
				}
			}
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage());
		}
	}
	
	public MLivro (String aDescricao,String aSigla,int aCodTipoLivro) throws Exception
	{
		ResultSet rs;
		String strQuery = "select TipoLivro.Descricao as TipoLivro From TipoLivro where TipoLivro.CodTipoLivro = " + aCodTipoLivro; 
		
		try
		{	
			rs = DB.executeQuery(strQuery);
			while(rs.next())
			{
				this.tipoLivro		= rs.getString("TipoLivro");
			}
			
			this.codLivro		= 0;
			this.codTipoLivro	= aCodTipoLivro;
			this.dataFim		= null;
			this.dataInicio		= new Date();
			this.descricao		= aDescricao;
			this.sigla			= aSigla;
			this.estado			= EstadoLivro.Aberto;
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage());
		}
	}
	
	
	private MLivro (int aCodLivro,String aDescricao,String aSigla,int aCodTipoLivro	,Date aDataInicio, Date aDataFim,int aEstado,String aTipoLivro) throws Exception
	{

			this.tipoLivro		= aTipoLivro;	
			this.codLivro		= aCodLivro;
			this.codTipoLivro	= aCodTipoLivro;
			this.dataFim		= aDataFim;
			this.dataInicio		= aDataInicio;
			this.descricao		= aDescricao;
			this.sigla			= aSigla;
			switch(aEstado)
			{
				case Constantes.lvAberto: this.estado = EstadoLivro.Aberto;break;
				case Constantes.lvFechado: this.estado = EstadoLivro.Fechado;break;
			}
			
	}
	
	
	public static List<MLivro> select(int aCodLivro, String aDescricao, String aSigla,EstadoLivro aEstado,int aCodTipoLivro) throws Exception
	{
		
		ResultSet rs;
		String descricao,sigla,tipoLivro;
		int codLivro,codTipoLivro;
		Date dataInicio,dataFim;
		int estado;
		
		List<MLivro> retorno  = new ArrayList<MLivro>();
		String strQuery = "select Livro.*,TipoLivro.Descricao as TipoLivro from livro,tipoLivro where livro.CodTipoLivro = TipoLivro.CodTipoLivro";

		if(aCodLivro > 0)
		{
			strQuery += " and Livro.CodLivro = " + aCodLivro;
		}
		
		if(aCodLivro > 0)
		{
			strQuery += " and Livro.CodTipoLivro = " + aCodTipoLivro;
		}
		
		switch (aEstado)
		{
			case Aberto: strQuery += " and Livro.Estado = " + Constantes.lvAberto;break;
			case Fechado: strQuery += " and Livro.Estado = " + Constantes.lvFechado;break;
		}
		
		strQuery += " and Livro.Descricao Like '" + aDescricao + "%'";
		strQuery += " and Livro.sigla Like '" + aSigla + "%'";
		
		
		try
		{
			rs = DB.executeQuery(strQuery);	
			
			while (rs.next())
			{
				codLivro 		= rs.getInt("CodLivro");
				codTipoLivro	= rs.getInt("CodTipoLivro");
				descricao		= rs.getString("Descricao");
				sigla			= rs.getString("Sigla");
				dataInicio		= rs.getDate("DataInicio"); 
				dataFim			= rs.getDate("DataFim");
				estado			= rs.getInt("Estado");
				tipoLivro		= rs.getString("TipoLivro");
				
				
				MLivro livro = new MLivro(codLivro,descricao,sigla,codTipoLivro,dataInicio,dataFim,estado,tipoLivro);
				retorno.add(livro);
				
			}	
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
		}
		
		return retorno;		
		
	}

	
	
	
	@Override
	public void update() throws Exception {
		
		ResultSet rs;
		
		//atualiza objeto
		String strQuery2 = "select Livro.*,TipoLivro.Descricao as TipoLivro from livro,tipoLivro where livro.CodTipoLivro = TipoLivro.CodTipoLivro";
		strQuery2 += " and  Livro.CodLivro = " + this.codLivro;
		
		String strQuery = "Update Livro set Descricao = '" + this.descricao + "'";
		strQuery += ", Sigla = '" + this.sigla + "'";
		strQuery += ", CodTipoLivro = " + this.codTipoLivro;
		strQuery += ", DataInicio = '" + this.dataInicio.toString() + "'";
		strQuery += ", DataFim = '" + this.dataFim.toString() + "'";
		
		switch(this.estado)
		{
			case Aberto: strQuery += ", Estado = " + Constantes.lvAberto;break;
			case Fechado: strQuery += ", Estado = " + Constantes.lvFechado;break;
		}
		
		
		strQuery += " Where Cidade.CodCidade = " + this.codTipoLivro;
		 
		
		try
		{
			DB.execute(strQuery);
			rs = DB.executeQuery(strQuery2);
			
			while (rs.next())
			{
				this.codLivro		= rs.getInt("CodLivro");
				this.codTipoLivro	= rs.getInt("CodTipoLivro");
				this.dataFim		= rs.getDate("DataFim");
				this.dataInicio		= rs.getDate("DataInicio");
				this.descricao		= rs.getString("Descricao");
				this.sigla			= rs.getString("Sigla");
				this.tipoLivro		= rs.getString("TipoLivro");
				
				switch(rs.getInt("CodTipoLivro"))
				{
					case Constantes.lvAberto: this.estado = EstadoLivro.Aberto;break;
					case Constantes.lvFechado: this.estado = EstadoLivro.Fechado;break;
				}
			}			
			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage());
		}

	}

	@Override
	public void excluir() throws Exception {

		String strQuery = "Delete From Livro Where Livro.CodLivro = " + this.codLivro;
		
		try
		{
			DB.execute(strQuery);			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
		}		
		
	}

	@Override
	public void insert() throws Exception {

		String strQuery = "Insert Into Livro(CodTipoLivro,Descricao,Sigla,DataInicio,DataFim,Estado) Values (";
		strQuery += this.codTipoLivro;
		strQuery += ",'" + this.descricao + "'";
		strQuery += ",'" + this.sigla + "')";
		strQuery += ",'" + this.dataInicio.toString() + "')";
		strQuery += ",'" + this.dataFim.toString() + "')";
		
		switch(this.estado)
		{
			case Aberto: strQuery += "," + Constantes.lvAberto;break;
			case Fechado:strQuery += "," + Constantes.lvFechado;break;
		}
		
		try
		{
			DB.execute(strQuery);			
		}
		catch(Exception e)
		{
			throw new Exception(e.getMessage() + "\n Comando: " + strQuery);
		}

	}

}
